﻿using lib.code;
using lib.code.Merkle;
using Newtonsoft.Json.Linq;
using System.Net;

namespace test
{
    internal class Program
    {
        async static void AsyncMain()
        {
            Console.WriteLine("test1");
            MerkleDBHelper.uri = new Uri("http://18.162.245.133:999/");


            var beginindex = MerkleDBHelper.GetFirstIndex();//index 起点，与深度有关，默认深度32
            var endindex = MerkleDBHelper.GetLastIndex();

            var root = MerkleDBHelper.GetEmptyRoot();//默克尔树起始点


            var data = new Data(System.Text.Encoding.UTF8.GetBytes("hello world"));

            var hash = data.CalcHash();

            ulong index = beginindex + 3;
            var b =  await MerkleDBHelper.update_record(hash, data);
            var data3 = await MerkleDBHelper.get_record(hash);
            var root2 = await MerkleDBHelper.update_leaf(root, index, hash);
            //index 相当于key，hash 相当于value

            var root3 = await MerkleDBHelper.update_leaf(root2, index + 1, hash);

            Console.WriteLine("result =" + root2);
            Console.WriteLine("result =" + root3);

            var hash2 = await MerkleDBHelper.get_leaf(root2, index);
            Console.WriteLine("hash2 =" + hash2);
            var hash3 = await MerkleDBHelper.get_leaf(root3, index);
            Console.WriteLine("hash3 =" + hash3);
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Test Server!");
            AsyncMain();
            //基本概念，服务器是一个文件存储链。
            //只能有一个操作,上传文件，不可删除。每次上传会给你一个 TXID（上传内容的Hash）
            //全局的RootHash 是默克尔根，每次上传文件他都会变。
            //每一个RootHash都代表上传过一个文件之后的状态，他是稳定的，可以作为防篡改数据
            //  WebClient wc = new WebClient();

            //}
            //{
            //    Console.WriteLine("测试 清除数据库，正式不要给这个接口，纯测试");
            //    var s = wc.DownloadString("http://127.0.0.1:999/admin_clear");
            //    Console.WriteLine("admin_clear =" + s);
            //}
            ////正式的测试不要去清理数据
            //{
            //    Console.WriteLine("测试 获取链状态");
            //    var s = wc.DownloadString("http://127.0.0.1:999/getstatus");
            //    Console.WriteLine("getstatus =" + s);
            //}
            //{
            //    var data = new byte[64];
            //    for (var i = 0; i < 64; i++)
            //    {
            //        data[i] = (byte)i;
            //    }
            //    {
            //        //试算功能可以不调用，纯粹计算一下hash而已。
            //        Console.WriteLine("测试 试算上传数据Hash(新的高度，roothash，数据本体，共同计算hash)");
            //        var info = wc.UploadData("http://127.0.0.1:999/tran_calc?roothash=FB58DD0EC400A31B16B7AAC46B909C94B99FDB96F8B89B256C0E3CBC932B4562&height=1", data);
            //        var txt = System.Text.Encoding.UTF8.GetString(info);
            //        Console.WriteLine("tran_calc =" + txt);
            //    }
            //    {
            //        //上传数据的roothash 必须是链的当前roothash,每次上传数据会变。
            //        //上传数据的height ,必须是链的当前height+1,每次上传数据会变。
            //        //这两个值会一起算hash
            //        //你只需要顺序上传数据，RootHash（默克尔根） 就会一直改变。
            //        Console.WriteLine("测试 上传数据");
            //        var info = wc.UploadData("http://127.0.0.1:999/tran_add?roothash=FB58DD0EC400A31B16B7AAC46B909C94B99FDB96F8B89B256C0E3CBC932B4562&height=1", data);
            //        var txt = System.Text.Encoding.UTF8.GetString(info);
            //        Console.WriteLine("tran_add =" + txt);
            //    }
            //}
            //{
            //    Console.WriteLine("测试 获取链状态");
            //    var s = wc.DownloadString("http://127.0.0.1:999/getstatus");
            //    Console.WriteLine("getstatus =" + s);
            //}

            //{
            //    Console.WriteLine("测试 根据高度，获取数据ID（hash)");
            //    var str = wc.DownloadString("http://127.0.0.1:999/tran_gettxid?height=1");
            //    Console.WriteLine("tran_gettxid =" + str);
            //}
            //{
            //    Console.WriteLine("测试 根据数据ID（hash)获取数据信息");
            //    var str = wc.DownloadString("http://127.0.0.1:999/tran_getinfo?txid=B2538056543573F228F7AB422E7D4741B71AF05E8D0BBA5B62BB312DEEC574C1");
            //    Console.WriteLine("tran_getinfo =" + str);
            //}
            //{
            //    Console.WriteLine("测试 根据数据ID（hash)获取数据");
            //    var s = wc.DownloadData("http://127.0.0.1:999/tran_getdata?txid=B2538056543573F228F7AB422E7D4741B71AF05E8D0BBA5B62BB312DEEC574C1");
            //    var str = "";
            //    foreach (var item in s)
            //    {
            //        str += item.ToString("X02");
            //    }
            //    Console.WriteLine("tran_getdata =" + str);
            //}
            Console.ReadLine();
        }
    }
}
